﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mvp.DTO;
using Mvp.DataAccess;

namespace Mvp.Task
{
    /*
     * 此接口是MVP模式的精华所在之一,GetDetailsForBook()很容易理解,几乎可以猜到它会把工作委托给DataAccess项目中的
     * IBookMapper去处理,关键在于GetBookList()方法,注意其返回的是ILookupCollection,而非一个IList<BookDTO>,这样我们在
     * 后面介绍中提供器中,只需要在获取到的ILookupCollection上调用BindTo方法,然后传递列表对象,就可以绑定列表了,实
     * 现了Web页面和CodeBehind逻辑的分离(MVP模式的精要所在);而如果这里我们仅仅返回IList<Book>,
     * 那么绑定列表的工作势必要移交给上一层去处理,GetBookList()的处理请参照IObjectToLookupConverter说明
     */

    public interface IBookTask
    {
        ILookupCollection GetBookList();

        BookDTO GetDetailsForBook(int bookID);
    }

    public class SimpleBookTask : IBookTask
    {
        private readonly IBookMapper _bookMapper;

        public SimpleBookTask(IBookMapper bookMapper)
        {
            _bookMapper = bookMapper;
        }

        public SimpleBookTask()
            :this(new SimpleBookMapper())
        {

        }

        #region IBookTask 成员

        public ILookupCollection GetBookList()
        {
            IList<ILoopupDTO> list = new BookToLookupConverter().ConvertAllFrom(_bookMapper.GetAllBooks());

            // 构建ILookupCollection
            return new SimpleLookupCollection(list);
        }

        public BookDTO GetDetailsForBook(int bookID)
        {
            return _bookMapper.FindById(bookID);
        }

        #endregion
    }
}
